package 链表;

/* https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ */

public class _82_删除排序链表中的重复元素二 {

    public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }
    public ListNode deleteDuplicates(ListNode head) {
        // 核心思路：定义一个虚拟节点让他指向head，作为head的前面一个节点，然后记录“坏数字（重复的数）”，循环判断链表中是否还有坏数字，有的话就删除他

        // new一个节点对象，让他的next指向head
        ListNode dummy_node = new ListNode();
        dummy_node.next = head;

        // 如果这里不定义一个变量来等于dummy_node的话，dummy_node会一直变化，必须让dummy_node不变，然后cur指代当前节点
        ListNode cur = dummy_node;

        if (head == null){
            return  null;
        }

        while (cur.next != null && cur.next.next != null){
            if (cur.next.val == cur.next.next.val){
                // 从链表的head开始，如果相邻的两个节点的value相等则记录这个value为bad_num
                int bad_num = cur.next.val;
                // 循环整个链表，看有没有节点的value和bad_num相同，如果有就跳过他指向他的下一个节点
                while(cur.next != null && cur.next.val == bad_num){
                    cur.next = cur.next.next;
                }
            }else {
                // 相邻的值不相等的话，保存现在的节点，让当前的节点往后移
                cur = cur.next;
            }
        }
        // 返回head
        return dummy_node.next;
    }
}
